#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;

class String
{
public:
	typedef char *iterator;

	String(const char *str = "");
	void Swap(String& s);
	// 拷贝构造————深拷贝
	String(const String &s);
	//String &operator=(const String &s); // 赋值拷贝
	String &operator=(String s);
	

	iterator begin();
	iterator end();

	const char *c_str() const; // 返回字符串类型
	size_t size() const;	   // 返回字符串长度
	size_t capacity() const;   // 返回字符串容量

	char &operator[](size_t i); // 重载[]，方便访问string
	const char &operator[](size_t i) const;


	// 友元函数，输出可以不用，因为没有访问到私有成员
	friend ostream &operator<<(ostream &out, const String &s);
	friend istream &operator>>(istream &in, String &s);
	void getline();//读取一行

	// 增容
	void reserve(size_t n);
	void resize(size_t n, char c = '\0');

	// 增删查改插入
	// 增
	void push_back(char c);
	void append(const char *str);
	String &operator+=(char c);			 // 常用，复用push_back
	String &operator+=(const char *str); // 复用append
	// 删——从pos位置开始删len个字符
	String& erase(size_t pos, size_t len = npos);
	//查——找某个字符或字符串，从pos位置开始找起，默认是起始位置
	size_t find(char ch, size_t pos = 0);
	size_t find(const char* str, size_t pos = 0);
	// 插入
	String &insert(size_t pos, char c);
	String &insert(size_t pos, const char *str);

	//字符串的比较
	bool operator<(const String& s);
	bool operator==(const String& s);
	bool operator<=(const String& s);
	bool operator>(const String& s);
	bool operator>=(const String& s);
	bool operator!=(const String& s);

	// 将字符串转成整型
	int StringToInt(char *str);

	// 析构函数
	~String();

private:
	char *_str;
	size_t _size;	  // 已有多少个有效字符
	size_t _capacity; // 能存多少个有效字符 \0不是有效字符

	static size_t npos;
};
